package com.example.stack;

/**
 * @className: StackByArray
 * @description: 使用数组实现栈
 * @author: LiuZhenHe
 * @date: 2024/01/12 16:37
 **/
public class ArrayStack {

    // 栈的最大容量
    private int maxSize;
    // 用于存放数据
    private int[] array;
    // 指针，指向栈顶
    private int topIndex = -1;

    public ArrayStack(int maxSize) {
        this.maxSize = maxSize;
        this.array = new int[maxSize];
    }

    public boolean isFull() {
        return topIndex == maxSize - 1;
    }

    public boolean isEmpty() {
        return topIndex == -1;
    }

    public void push(int number) {
        if (isFull()) {
            System.out.println("栈容量已满，无法继续添加数据");
            return;
        }
        topIndex++;
        array[topIndex] = number;
    }

    public int pop() {
        if (isEmpty()) {
            System.out.println("栈中没有数据，请先添加数据");
            return 0;
        }
        int value = array[topIndex];
        topIndex--;
        return value;
    }

    /**
     * 遍历栈
     */
    public void list(){
        while (true){
            if(isEmpty()){
                break;
            }
            System.out.println(pop());;
        }
    }

    /**
     * 遍历栈，方式2
     * 从顶部开始遍历
     */
    public void list2() {
        if (isEmpty()) {
            System.out.println("栈中没有数据，请先添加数据");
            return;
        }
        for (int i = topIndex; i >= 0; i--) {
            System.out.printf("stack[%d]=%d\n",i,array[i]);
        }
    }
    /**
     * 实现思路
     * 创建一个数组用于保存数据
     * 创建一个指针指向栈顶，默认指向-1
     * 入栈时，先让指针++，然后数据插入到指针指向的位置
     * 出站时，先获取到当前指针指向的数据，再让指针--，表示出栈，最后返回要获取的数据
     */
}
